#include "stdafx.h"
#include "CppUnitTest.h"

#include "System/Base/Integer.h"
#include "System/Utility/Testing.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;
using namespace Native::System;
using namespace Native { namespace System::Utility;

namespace TestNativeSystem
{
    TEST_CLASS(Integer_Tester)
    {
    public:
        CInteger<int32_t> _base;

        Integer_Tester()
        {
            _base.Value(1983);
        }

        TEST_METHOD(Integer_EqualTo)
        {
            UEquivalentTester::CheckByEqualTo<CInteger<int32_t>>(
                dynamic_cast<IEqualTo<CInteger<int32_t>>*>(&_base),
                CInteger<int32_t>(-1987),
                false);
        }

        TEST_METHOD(Integer_ObjectConstructor)
        {
            UConstructorTester::CheckByEqualTo<CInteger<int32_t>>(_base);
        }

        TEST_METHOD(Integer_ConvertInt8ToString)
        {
            Int8s integer8s = INT8_MAX;
            Int8u integer8u = UINT8_MAX;

            Assert::IsTrue(integer8s.ToDecimalString() == L"127");
            Assert::IsTrue(integer8u.ToDecimalString() == L"255");
            Assert::IsTrue(integer8s.ToHexadecimalString() == L"7F");
            Assert::IsTrue(integer8u.ToHexadecimalString() == L"FF");
        }

        TEST_METHOD(Integer_ConvertInt16ToString)
        {
            Int16s integer16s = INT16_MAX;
            Int16u integer16u = UINT16_MAX;

            Assert::IsTrue(integer16s.ToDecimalString() == L"32767");
            Assert::IsTrue(integer16u.ToDecimalString() == L"65535");
            Assert::IsTrue(integer16s.ToHexadecimalString() == L"7FFF");
            Assert::IsTrue(integer16u.ToHexadecimalString() == L"FFFF");
        }

        TEST_METHOD(Integer_ConvertInt32ToString)
        {
            Int32s integer32s = INT32_MAX;
            Int32u integer32u = UINT32_MAX;

            Assert::IsTrue(integer32s.ToDecimalString() == L"2147483647");
            Assert::IsTrue(integer32u.ToDecimalString() == L"4294967295");
            Assert::IsTrue(integer32s.ToHexadecimalString() == L"7FFFFFFF");
            Assert::IsTrue(integer32u.ToHexadecimalString() == L"FFFFFFFF");
        }

        TEST_METHOD(Integer_ConvertInt64ToString)
        {
            Int64s integer64s = INT64_MAX;
            Int64u integer64u = UINT64_MAX;

            Assert::IsTrue(integer64s.ToDecimalString() == L"9223372036854775807");
            Assert::IsTrue(integer64u.ToDecimalString() == L"18446744073709551615");
            Assert::IsTrue(integer64s.ToHexadecimalString() == L"7FFFFFFFFFFFFFFF");
            Assert::IsTrue(integer64u.ToHexadecimalString() == L"FFFFFFFFFFFFFFFF");
        }
    };

    
    //    TEST_METHOD(Int8_CompareEqualOrNot)
    //    {
    //        {
    //            Int8s integer1 = INT8_MAX;
    //            Int8s integer2 = INT8_MIN;

    //            Assert::IsTrue(integer1 == integer1);
    //            Assert::IsTrue(integer1 != integer2);
    //        }

    //        {
    //            Int8u integer1 = UINT8_MAX;
    //            Int8u integer2 = 0;

    //            Assert::IsTrue(integer1 == integer1);
    //            Assert::IsTrue(integer1 != integer2);
    //        }
    //    }

    //    TEST_METHOD(Int8_CompareLessOrBigThan)
    //    {
    //        {
    //            Int8s integer1 = INT8_MAX;
    //            Int8s integer2 = INT8_MIN;

    //            Assert::IsTrue(integer1 > integer2);
    //            Assert::IsTrue(integer2 < integer1);
    //            Assert::IsTrue(integer1 >= integer2);
    //            Assert::IsTrue(integer2 <= integer1);
    //        }

    //        {
    //            Int8u integer1 = UINT8_MAX;
    //            Int8u integer2 = 0;

    //            Assert::IsTrue(integer1 > integer2);
    //            Assert::IsTrue(integer2 < integer1);
    //            Assert::IsTrue(integer1 >= integer2);
    //            Assert::IsTrue(integer2 <= integer1);
    //        }
    //    }
    //};

    
    //    TEST_METHOD(Int16_CompareEqualOrNot)
    //    {
    //        {
    //            Int16s integer1 = INT16_MAX;
    //            Int16s integer2 = INT16_MIN;

    //            Assert::IsTrue(integer1 == integer1);
    //            Assert::IsTrue(integer1 != integer2);
    //        }

    //        {
    //            Int16u integer1 = UINT16_MAX;
    //            Int16u integer2 = 0;

    //            Assert::IsTrue(integer1 == integer1);
    //            Assert::IsTrue(integer1 != integer2);
    //        }
    //    }

    //    TEST_METHOD(Int16_CompareLessOrBigThan)
    //    {
    //        {
    //            Int16s integer1 = INT16_MAX;
    //            Int16s integer2 = INT16_MIN;

    //            Assert::IsTrue(integer1 > integer2);
    //            Assert::IsTrue(integer2 < integer1);
    //            Assert::IsTrue(integer1 >= integer2);
    //            Assert::IsTrue(integer2 <= integer1);
    //        }

    //        {
    //            Int16u integer1 = UINT16_MAX;
    //            Int16u integer2 = 0;

    //            Assert::IsTrue(integer1 > integer2);
    //            Assert::IsTrue(integer2 < integer1);
    //            Assert::IsTrue(integer1 >= integer2);
    //            Assert::IsTrue(integer2 <= integer1);
    //        }
    //    }
    //};
   

    //    TEST_METHOD(Int32_CompareEqualOrNot)
    //    {
    //        {
    //            Int32s integer1 = INT32_MAX;
    //            Int32s integer2 = INT32_MIN;

    //            Assert::IsTrue(integer1 == integer1);
    //            Assert::IsTrue(integer1 != integer2);
    //        }

    //        {
    //            Int32u integer1 = UINT32_MAX;
    //            Int32u integer2 = 0;

    //            Assert::IsTrue(integer1 == integer1);
    //            Assert::IsTrue(integer1 != integer2);
    //        }
    //    }

    //    TEST_METHOD(Int32_CompareLessOrBigThan)
    //    {
    //        {
    //            Int32s integer1 = INT32_MAX;
    //            Int32s integer2 = INT32_MIN;

    //            Assert::IsTrue(integer1 > integer2);
    //            Assert::IsTrue(integer2 < integer1);
    //            Assert::IsTrue(integer1 >= integer2);
    //            Assert::IsTrue(integer2 <= integer1);
    //        }

    //        {
    //            Int32u integer1 = UINT32_MAX;
    //            Int32u integer2 = 0;

    //            Assert::IsTrue(integer1 > integer2);
    //            Assert::IsTrue(integer2 < integer1);
    //            Assert::IsTrue(integer1 >= integer2);
    //            Assert::IsTrue(integer2 <= integer1);
    //        }
    //    }
    //};

    //TEST_CLASS(Int64_Tester)
    //{
    //public:
    //    TEST_METHOD(Int64_Construct)
    //    {
    //        //Default
    //        {
    //            Int64s integer64s;
    //            Int64u integer64u;

    //            Assert::IsTrue(integer64s == 0);
    //            Assert::IsTrue(integer64u == 0);
    //        }
    //        //Copy
    //        {
    //            Int64s integer64s;
    //            Int64s integer64sCopied(integer64s);
    //            Int64u integer64u;
    //            Int64u integer64uCopied(integer64u);

    //            Assert::IsTrue(integer64s == integer64sCopied);
    //            Assert::IsTrue(integer64u == integer64uCopied);
    //        }
    //        //Move
    //        {
    //            Int64s integer64s([]{Int64s integer(INT64_MAX); return move(integer);}());
    //            Int64u integer64u([]{Int64u integer(UINT64_MAX); return move(integer);}());

    //            Assert::IsTrue(integer64s == INT64_MAX);
    //            Assert::IsTrue(integer64u == UINT64_MAX);
    //        }
    //        //assign
    //        {
    //            Int64s integer64s(INT64_MAX);
    //            Int64u integer64u(UINT64_MAX);
    //            Assert::IsTrue(integer64s == INT64_MAX);
    //            Assert::IsTrue(integer64u == UINT64_MAX);
    //        }
    //        //operator
    //        {
    //            Int64s integer64s = INT64_MAX;
    //            Int64u integer64u = UINT64_MAX;

    //            Assert::IsTrue(integer64s == INT64_MAX);
    //            Assert::IsTrue(integer64u == UINT64_MAX);
    //        }
    //    }

    //    TEST_METHOD(Int64_ConvertToDecimalString)
    //    {
    //        Int64s integer64s = INT64_MAX;
    //        Int64u integer64u = UINT64_MAX;

    //        Assert::AreEqual(integer64s.ToDecimalString().c_str(), L"9223372036854775807");
    //        Assert::AreEqual(integer64u.ToDecimalString().c_str(), L"18446744073709551615");
    //    }

    //    TEST_METHOD(Int64_ConvertToHexadecimaString)
    //    {
    //        Int64s integer64s = INT64_MAX;
    //        Int64u integer64u = UINT64_MAX;

    //        Assert::AreEqual(integer64s.ToHexadecimalString().c_str(), L"0x7FFFFFFFFFFFFFFF");
    //        Assert::AreEqual(integer64u.ToHexadecimalString().c_str(), L"0xFFFFFFFFFFFFFFFF");
    //    }

    //    TEST_METHOD(Int64_CompareEqualOrNot)
    //    {
    //        {
    //            Int64s integer1 = INT64_MAX;
    //            Int64s integer2 = INT64_MIN;

    //            Assert::IsTrue(integer1 == integer1);
    //            Assert::IsTrue(integer1 != integer2);
    //        }

    //        {
    //            Int64u integer1 = UINT64_MAX;
    //            Int64u integer2 = 0;

    //            Assert::IsTrue(integer1 == integer1);
    //            Assert::IsTrue(integer1 != integer2);
    //        }
    //    }

    //    TEST_METHOD(Int64_CompareLessOrBigThan)
    //    {
    //        {
    //            Int64s integer1 = INT64_MAX;
    //            Int64s integer2 = INT64_MIN;

    //            Assert::IsTrue(integer1 > integer2);
    //            Assert::IsTrue(integer2 < integer1);
    //            Assert::IsTrue(integer1 >= integer2);
    //            Assert::IsTrue(integer2 <= integer1);
    //        }

    //        {
    //            Int64u integer1 = UINT64_MAX;
    //            Int64u integer2 = 0;

    //            Assert::IsTrue(integer1 > integer2);
    //            Assert::IsTrue(integer2 < integer1);
    //            Assert::IsTrue(integer1 >= integer2);
    //            Assert::IsTrue(integer2 <= integer1);
    //        }
    //    }
    //};
}